/*
 * Copyright (c) 2010 Zauber S.A.  -- All rights reserved
 */
package ar.edu.itba.ia2010.geneticos.motor.api.sintaxistree.generators;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.apache.commons.lang.Validate;

import ar.edu.itba.ia2010.geneticos.motor.api.Cromosoma;
import ar.edu.itba.ia2010.geneticos.motor.api.EstrategiaGeneracionCromosomas;
import ar.edu.itba.ia2010.geneticos.motor.api.sintaxistree.Expresion;
import ar.edu.itba.ia2010.geneticos.motor.api.sintaxistree.bitwise.ExpresionCromosoma;
import ar.edu.itba.ia2010.geneticos.motor.api.sintaxistree.impl.ExpresionMotorGeneticoContext;

/**
 * Estrategia de generacion de cromosomas de arbol sintactico
 * 
 * @author Juan F. Codagnone
 * @since Mar 28, 2010
 */
public class ExpresionEstrategiaGeneracionCromosomas 
  implements EstrategiaGeneracionCromosomas<Expresion> {
    
    private final int n;
    private final Random random;
    private final ExpresionMotorGeneticoContext ctx;

    /** Creates the ExpresionEstrategiaGeneracionCromosomas. */
    public ExpresionEstrategiaGeneracionCromosomas(final int n,
            final Random random,
            final ExpresionMotorGeneticoContext ctx) {
        Validate.isTrue(n > 0);
        Validate.notNull(random);
        Validate.notNull(ctx);
        
        this.n = n;
        this.random = random;
        this.ctx = ctx;
    }
    
    /** @see EstrategiaGeneracionCromosomas#generate() */
    public final List<Cromosoma<Expresion>> generate() {
        final List<Cromosoma<Expresion>> ret = 
            new ArrayList<Cromosoma<Expresion>>(n);
        
        for(int i = 0; i < n; i++) {
            ret.add(new ExpresionCromosoma(ctx.getGenerator().generate(
                    random, ctx.getMaxDepth())));
        }
        
        return ret;
    }
}
